/**
 * @(#)ISystemProcessHistoryService.java 2009-11-27
 *   
 * Copyright  (c) 2009-2010 Wilmar IT Service,  Inc.   
 * All  rights  reserved.   
 * TODO
 */

package com.wilmar.process.core.services.api;

import java.util.List;

import org.jbpm.api.history.HistoryDetail;
import org.jbpm.api.history.HistoryTask;

import com.wilmar.common.util.PageinationEntity;
import com.wilmar.process.entity.User;
import com.wilmar.process.entity.query.HistoryTaskInstanceQueryObject;
import com.wilmar.process.entity.vo.HistoryTaskInstanceVO;
import com.wilmar.process.exception.ObjectNotFoundException;
import com.wilmar.process.exception.PermissionDeniedException;

/**
 * 系统流程历史服务接口
 * 
 * @author asus Email:zhoulibo_java@msn.cn
 * @version 1.0.0
 */

public interface ISystemHistoryTaskInstanceService extends
		IBaseService<HistoryTaskInstanceVO, HistoryTask> {

	/**
	 * 
	 * 通过用户查找该用户已经处理过的历史任务集合
	 * 
	 * @param user
	 *            用户
	 * @param page
	 *            分页信息
	 * @return 历史任务实例集合
	 */
	public List<HistoryTask> getListProcessHistoryByUser(User user,
			PageinationEntity page);

	/**
	 * 与getListProcessHistoryByUser相同,只是返回的为VO对象,转换成VO的同时也已经判断当前用户是否拥有撤回该任务的权限
	 * 
	 * @param user
	 *            用户
	 * @param page
	 *            分页信息
	 * @return 历史任务实例集合
	 * @throws ObjectNotFoundException
	 *             如果没有找到流程辅助信息
	 */
	public List<HistoryTaskInstanceVO> getVoListProcessHistoryByUser(User user,
			PageinationEntity page) throws ObjectNotFoundException;

	/**
	 * 撤回任务,只有当前用户是流程的最后处理人,并且当前所有活动的任务全部没有被接收才能撤回
	 * 
	 * @param taskInstanceId
	 *            任务实例编号
	 * @param revoker
	 *            撤回用户
	 * @throws ObjectNotFoundException
	 *             如果任务实例编号对应历史数据并没有找到
	 * @throws PermissionDeniedException
	 *             如果当前用户无权撤回该任务
	 * @return 撤回后的任务的实例编号
	 */
	public String revokeTask(String taskInstanceId, User revoker)
			throws ObjectNotFoundException, PermissionDeniedException;

	/**
	 * 根据用户查询用户的历史任务记录
	 * 
	 * @param user
	 *            用户
	 * @param prototype
	 *            页面查询对象
	 * @return 历史任务实例集合
	 */
	public List<HistoryTask> getListUserHistroryTask(User user,
			HistoryTaskInstanceQueryObject prototype);

	/**
	 * 查询当前用户对应的历史任务记录
	 * 
	 * @param user
	 *            用户
	 * @param prototype
	 *            页面查询对象
	 * @return 历史任务实例集合
	 * @throws ObjectNotFoundException
	 *             如果任务实例编号对应历史数据并没有找到
	 */
	public List<HistoryTaskInstanceVO> getVOListHistroyTaskList(User user,
			HistoryTaskInstanceQueryObject prototype)
			throws ObjectNotFoundException;

	public List<HistoryDetail> getCommentList(String taskInstanceId);

	/**
	 * 根据历史任务实例编号获取历史任务实例实体
	 * 
	 * @param taskInstanceId
	 *            历史任务实例编号
	 * @return 历史任务实例实体
	 * @throws ObjectNotFoundException
	 *             当历史任务实例编号没有对应的历史任务实例实体时
	 */
	public HistoryTask getDetailById(String taskInstanceId)
			throws ObjectNotFoundException;
}
